@gajae-code/coding-agent 0.17.1 → 0.17.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +266 -0
- package/dist/types/async/job-manager.d.ts +7 -6
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/github-release.d.ts +17 -0
- package/dist/types/cli/public-command-entry.d.ts +56 -0
- package/dist/types/cli/public-command-errors.d.ts +126 -0
- package/dist/types/cli/public-command-evidence.d.ts +99 -0
- package/dist/types/cli/public-command-help.d.ts +65 -0
- package/dist/types/cli/public-command-registry.d.ts +69 -0
- package/dist/types/cli/session-picker.d.ts +1 -1
- package/dist/types/cli/setup-cli.d.ts +1 -0
- package/dist/types/cli/skills-cli.d.ts +5 -0
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +4 -50
- package/dist/types/commands/sdk.d.ts +20 -37
- package/dist/types/commands/setup.d.ts +3 -0
- package/dist/types/commands/skills.d.ts +9 -0
- package/dist/types/config/autorouting-tier-map.d.ts +24 -0
- package/dist/types/config/file-lock.d.ts +10 -1
- package/dist/types/config/model-profile-activation.d.ts +63 -4
- package/dist/types/config/model-registry.d.ts +20 -2
- package/dist/types/config/settings-schema.d.ts +11 -0
- package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
- package/dist/types/coordinator-mcp/server.d.ts +3 -0
- package/dist/types/daemon/operator-contract.d.ts +5 -1
- package/dist/types/eval/js/worker-protocol.d.ts +2 -0
- package/dist/types/extensibility/extensions/types.d.ts +12 -0
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
- package/dist/types/extensibility/shared-events.d.ts +3 -1
- package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
- package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
- package/dist/types/internal-urls/index.d.ts +1 -0
- package/dist/types/internal-urls/parse.d.ts +9 -1
- package/dist/types/main.d.ts +22 -0
- package/dist/types/modes/acp/acp-agent.d.ts +94 -1
- package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
- package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
- package/dist/types/modes/components/session-selector.d.ts +5 -2
- package/dist/types/modes/components/thinking-selector.d.ts +2 -1
- package/dist/types/modes/components/user-message-selector.d.ts +5 -2
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
- package/dist/types/modes/types.d.ts +2 -2
- package/dist/types/runtime/process-lifecycle.d.ts +2 -0
- package/dist/types/runtime-mcp/manager.d.ts +56 -0
- package/dist/types/runtime-mcp/pool.d.ts +17 -0
- package/dist/types/runtime-mcp/redaction.d.ts +20 -0
- package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
- package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
- package/dist/types/sdk/acp/adapter.d.ts +27 -0
- package/dist/types/sdk/acp/final-text.d.ts +8 -0
- package/dist/types/sdk/broker/broker.d.ts +13 -2
- package/dist/types/sdk/broker/ensure.d.ts +46 -1
- package/dist/types/sdk/broker/identity.d.ts +3 -1
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
- package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
- package/dist/types/sdk/broker/runtime.d.ts +1 -1
- package/dist/types/sdk/broker/session-index.d.ts +22 -3
- package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
- package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
- package/dist/types/sdk/bus/index.d.ts +19 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
- package/dist/types/sdk/cli/master-cli.d.ts +6 -10
- package/dist/types/sdk/cli/rows.d.ts +19 -1
- package/dist/types/sdk/cli/session-cli.d.ts +22 -5
- package/dist/types/sdk/client/client.d.ts +2 -0
- package/dist/types/sdk/guides/cli.d.ts +3 -4
- package/dist/types/sdk/guides/verify.d.ts +2 -0
- package/dist/types/sdk/host/host.d.ts +9 -0
- package/dist/types/sdk/host/session-runtime.d.ts +31 -0
- package/dist/types/sdk/host/types.d.ts +10 -0
- package/dist/types/sdk/index.d.ts +1 -0
- package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +38 -1
- package/dist/types/sdk/prompt-failure.d.ts +30 -1
- package/dist/types/sdk/prompt-status.d.ts +8 -0
- package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
- package/dist/types/sdk/router/replay-retention-gap-cache.d.ts +13 -0
- package/dist/types/sdk/router/session-router.d.ts +2 -0
- package/dist/types/sdk/startup-capability.d.ts +2 -0
- package/dist/types/sdk/transport/relay.d.ts +1 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +73 -2
- package/dist/types/sdk/transport/stdio.d.ts +5 -1
- package/dist/types/session/agent-session.d.ts +168 -21
- package/dist/types/session/fallback-chain-controller.d.ts +6 -6
- package/dist/types/session/fold-coordinator.d.ts +17 -3
- package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
- package/dist/types/session/session-manager.d.ts +64 -1
- package/dist/types/session/session-work-lease.d.ts +14 -0
- package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
- package/dist/types/setup/provider-onboarding.d.ts +81 -1
- package/dist/types/thinking.d.ts +3 -1
- package/dist/types/tools/bash.d.ts +37 -11
- package/dist/types/tools/job.d.ts +1 -1
- package/dist/types/tools/steer-fold.d.ts +31 -0
- package/dist/types/utils/git.d.ts +28 -2
- package/dist/types/utils/mupdf-embedded.d.ts +2 -0
- package/dist/types/utils/mupdf-wasm-embedded.d.ts +2 -0
- package/dist/types/utils/mupdf.d.ts +4 -0
- package/dist/types/utils/session-title-generation.d.ts +6 -0
- package/dist/types/utils/title-generator.d.ts +11 -2
- package/dist/types/web/scrapers/types.d.ts +3 -0
- package/package.json +18 -10
- package/scripts/build-binary.ts +9 -3
- package/scripts/compile-args.ts +0 -9
- package/scripts/embed-mupdf.ts +52 -0
- package/scripts/generate-sdk-operation-inventory.ts +31 -1
- package/scripts/vendor-markit.ts +196 -0
- package/src/async/job-manager.ts +60 -9
- package/src/cli/daemon-cli.ts +53 -18
- package/src/cli/github-release.ts +87 -5
- package/src/cli/mcp-cli.ts +38 -4
- package/src/cli/public-command-entry.ts +450 -0
- package/src/cli/public-command-errors.ts +581 -0
- package/src/cli/public-command-evidence.ts +717 -0
- package/src/cli/public-command-help.ts +360 -0
- package/src/cli/public-command-registry.ts +535 -0
- package/src/cli/session-picker.ts +2 -1
- package/src/cli/setup-cli.ts +9 -1
- package/src/cli/skills-cli.ts +46 -2
- package/src/cli.ts +61 -1
- package/src/commands/daemon.ts +65 -69
- package/src/commands/sdk.ts +232 -100
- package/src/commands/setup.ts +2 -0
- package/src/commands/skills.ts +11 -0
- package/src/config/autorouting-tier-map.ts +16 -0
- package/src/config/file-lock.ts +199 -68
- package/src/config/model-profile-activation.ts +406 -53
- package/src/config/model-registry.ts +204 -25
- package/src/config/settings-schema.ts +26 -2
- package/src/coordinator-mcp/policy.ts +10 -5
- package/src/coordinator-mcp/question-gate-codec.ts +17 -0
- package/src/coordinator-mcp/question-state.ts +175 -8
- package/src/coordinator-mcp/server.ts +528 -87
- package/src/coordinator-mcp/session-reaper.ts +6 -4
- package/src/crash/record-loader.ts +6 -2
- package/src/daemon/operator-contract.ts +26 -12
- package/src/debug/report-bundle.ts +114 -24
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
- package/src/eval/js/context-manager.ts +8 -8
- package/src/eval/js/worker-core.ts +9 -4
- package/src/eval/js/worker-protocol.ts +2 -0
- package/src/extensibility/extensions/runner.ts +52 -4
- package/src/extensibility/extensions/types.ts +10 -0
- package/src/extensibility/gjc-plugins/registry.ts +196 -37
- package/src/extensibility/runtime-skill-discovery.ts +61 -3
- package/src/extensibility/shared-events.ts +3 -1
- package/src/gjc-runtime/managed-owner-admission.ts +67 -50
- package/src/gjc-runtime/session-state-lock.ts +165 -24
- package/src/gjc-runtime/ultragoal-succession.ts +31 -3
- package/src/internal-urls/docs-index.generated.ts +21 -19
- package/src/internal-urls/embedded-protocol.ts +83 -0
- package/src/internal-urls/index.ts +1 -0
- package/src/internal-urls/parse.ts +21 -1
- package/src/internal-urls/router.ts +4 -2
- package/src/main.ts +123 -55
- package/src/modes/acp/acp-agent.ts +593 -47
- package/src/modes/acp/acp-event-mapper.ts +9 -0
- package/src/modes/acp/startup-provenance.ts +59 -0
- package/src/modes/components/custom-provider-wizard.ts +308 -7
- package/src/modes/components/model-selector.ts +31 -15
- package/src/modes/components/oauth-selector.ts +9 -0
- package/src/modes/components/session-selector.ts +47 -4
- package/src/modes/components/status-line/segments.ts +6 -1
- package/src/modes/components/thinking-selector.ts +7 -3
- package/src/modes/components/user-message-selector.ts +57 -15
- package/src/modes/controllers/command-controller.ts +58 -32
- package/src/modes/controllers/extension-ui-controller.ts +33 -7
- package/src/modes/controllers/input-controller.ts +4 -0
- package/src/modes/controllers/selector-controller.ts +177 -18
- package/src/modes/interactive-mode.ts +21 -7
- package/src/modes/runtime-init.ts +1 -0
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
- package/src/modes/types.ts +2 -2
- package/src/prompts/agent-fragments/browser-aside.md +1 -0
- package/src/prompts/system/title-system.md +1 -1
- package/src/prompts/tools/bash.md +1 -1
- package/src/prompts/tools/job.md +1 -1
- package/src/prompts/tools/read.md +2 -0
- package/src/runtime/network-prewarm-service.test.ts +36 -1
- package/src/runtime/network-prewarm-service.ts +28 -3
- package/src/runtime/process-lifecycle.ts +22 -11
- package/src/runtime-mcp/config.ts +16 -1
- package/src/runtime-mcp/manager.ts +689 -55
- package/src/runtime-mcp/pool.test.ts +31 -0
- package/src/runtime-mcp/pool.ts +304 -28
- package/src/runtime-mcp/redaction.ts +42 -0
- package/src/runtime-mcp/startup-policy.ts +7 -0
- package/src/runtime-mcp/tool-bridge.ts +71 -0
- package/src/runtime-mcp/transports/http.ts +108 -25
- package/src/sdk/acp/adapter.ts +90 -9
- package/src/sdk/acp/final-text.ts +19 -2
- package/src/sdk/broker/broker.ts +378 -52
- package/src/sdk/broker/ensure.ts +97 -19
- package/src/sdk/broker/identity.ts +9 -1
- package/src/sdk/broker/lifecycle-ledger.ts +95 -31
- package/src/sdk/broker/lifecycle.ts +690 -141
- package/src/sdk/broker/runtime.ts +1 -1
- package/src/sdk/broker/session-index.ts +97 -4
- package/src/sdk/broker/spawn-authority.ts +35 -7
- package/src/sdk/broker/stderr-drainer.ts +59 -0
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
- package/src/sdk/bus/index.ts +721 -84
- package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
- package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
- package/src/sdk/bus/telegram-daemon.ts +10 -3
- package/src/sdk/cli/master-cli.ts +47 -36
- package/src/sdk/cli/rows.ts +30 -7
- package/src/sdk/cli/session-cli.ts +687 -184
- package/src/sdk/client/client.ts +18 -0
- package/src/sdk/guides/catalog.ts +2 -2
- package/src/sdk/guides/cli.ts +20 -62
- package/src/sdk/guides/verify.ts +14 -0
- package/src/sdk/host/host.ts +49 -5
- package/src/sdk/host/session-runtime.test.ts +636 -9
- package/src/sdk/host/session-runtime.ts +499 -118
- package/src/sdk/host/types.ts +12 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
- package/src/sdk/host/websocket-transport.ts +40 -6
- package/src/sdk/index.ts +11 -0
- package/src/sdk/prompt-deadline-flush.ts +334 -0
- package/src/sdk/prompt-deadline-manager.ts +136 -4
- package/src/sdk/prompt-failure.ts +43 -1
- package/src/sdk/prompt-status.ts +8 -0
- package/src/sdk/prompt-tool-boundary.ts +121 -0
- package/src/sdk/protocol/operation-inventory.generated.json +106 -0
- package/src/sdk/router/replay-retention-gap-cache.ts +27 -0
- package/src/sdk/router/session-router.ts +31 -4
- package/src/sdk/session.ts +194 -16
- package/src/sdk/startup-capability.ts +1 -1
- package/src/sdk/transport/relay.ts +71 -6
- package/src/sdk/transport/serve-cli.ts +494 -49
- package/src/sdk/transport/socket.ts +12 -11
- package/src/sdk/transport/stdio.ts +7 -3
- package/src/session/agent-session.ts +2437 -400
- package/src/session/fallback-chain-controller.ts +6 -7
- package/src/session/fold-coordinator.ts +24 -5
- package/src/session/internal/managed-session-scope.ts +58 -18
- package/src/session/internal/managed-session-storage.ts +304 -11
- package/src/session/session-manager.ts +382 -44
- package/src/session/session-work-lease.ts +34 -0
- package/src/session-import/codex.ts +12 -3
- package/src/setup/model-onboarding-guidance.ts +1 -1
- package/src/setup/provider-onboarding.ts +397 -24
- package/src/slash-commands/builtin-registry.ts +258 -14
- package/src/task/index.ts +14 -2
- package/src/thinking.ts +21 -2
- package/src/tools/bash.ts +98 -78
- package/src/tools/fetch.ts +119 -20
- package/src/tools/job.ts +151 -25
- package/src/tools/output-meta.ts +15 -2
- package/src/tools/path-utils.ts +27 -3
- package/src/tools/read.ts +3 -3
- package/src/tools/steer-fold.ts +107 -0
- package/src/tools/tool-catalog.generated.ts +29 -2
- package/src/tools/tool-errors.ts +4 -0
- package/src/utils/git.ts +53 -3
- package/src/utils/markit.ts +55 -41
- package/src/utils/mupdf-assets.d.ts +4 -0
- package/src/utils/mupdf-embedded.ts +4 -0
- package/src/utils/mupdf-wasm-embedded.ts +3 -0
- package/src/utils/mupdf-wasm.ts +24 -2
- package/src/utils/mupdf.ts +129 -0
- package/src/utils/session-title-generation.ts +29 -0
- package/src/utils/title-generator.ts +46 -2
- package/src/web/scrapers/types.ts +24 -3
- package/vendor/markit-ai/LICENSE +21 -0
- package/vendor/markit-ai/MANIFEST.json +412 -0
- package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/config.js +139 -0
- package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
- package/vendor/markit-ai/dist/commands/convert.js +113 -0
- package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/formats.js +92 -0
- package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/init.js +29 -0
- package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
- package/vendor/markit-ai/dist/commands/onboard.js +61 -0
- package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
- package/vendor/markit-ai/dist/commands/plugin.js +58 -0
- package/vendor/markit-ai/dist/config.d.ts +26 -0
- package/vendor/markit-ai/dist/config.js +42 -0
- package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/audio.js +104 -0
- package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
- package/vendor/markit-ai/dist/converters/csv.js +83 -0
- package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/docx.js +57 -0
- package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/epub.js +128 -0
- package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
- package/vendor/markit-ai/dist/converters/github.js +148 -0
- package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/html.js +30 -0
- package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/image.js +124 -0
- package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
- package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
- package/vendor/markit-ai/dist/converters/iwork.js +391 -0
- package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/json.js +21 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
- package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
- package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
- package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
- package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
- package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
- package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
- package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
- package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
- package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
- package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
- package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/pptx.js +289 -0
- package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
- package/vendor/markit-ai/dist/converters/rss.js +138 -0
- package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
- package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
- package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/xml.js +18 -0
- package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
- package/vendor/markit-ai/dist/converters/yaml.js +17 -0
- package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
- package/vendor/markit-ai/dist/converters/zip.js +57 -0
- package/vendor/markit-ai/dist/index.d.ts +30 -0
- package/vendor/markit-ai/dist/index.js +26 -0
- package/vendor/markit-ai/dist/main.d.ts +2 -0
- package/vendor/markit-ai/dist/main.js +191 -0
- package/vendor/markit-ai/dist/markit.d.ts +45 -0
- package/vendor/markit-ai/dist/markit.js +267 -0
- package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
- package/vendor/markit-ai/dist/plugins/api.js +42 -0
- package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
- package/vendor/markit-ai/dist/plugins/index.js +3 -0
- package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/installer.js +176 -0
- package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
- package/vendor/markit-ai/dist/plugins/loader.js +61 -0
- package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
- package/vendor/markit-ai/dist/plugins/types.js +1 -0
- package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
- package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
- package/vendor/markit-ai/dist/providers/index.js +56 -0
- package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
- package/vendor/markit-ai/dist/providers/openai.js +76 -0
- package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
- package/vendor/markit-ai/dist/providers/types.js +1 -0
- package/vendor/markit-ai/dist/types.d.ts +36 -0
- package/vendor/markit-ai/dist/types.js +1 -0
- package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
- package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
- package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
- package/vendor/markit-ai/dist/utils/output.js +31 -0
- package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
- package/vendor/markit-ai/dist/utils/turndown.js +70 -0
- package/vendor/markit-ai/package.json +74 -0
- package/vendor/markit-ai.patch +49 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,272 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.17.4] - 2026-09-23
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- The newly bundled `gpt-6-sol` and `gpt-6-luna` Codex rows are declared in the autorouting tier-map skip list, exactly as `gpt-6-astra` already is, so `check:autorouting-map` and its CI gate keep passing and the two new keys do not silently shift role routing before they are curated.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- ACP startup capability-query failures now report only a bounded safe category from known failure codes, or a fixed generic label, instead of exposing host-supplied error details. A host that does not answer the query remains distinct from a live outdated host, which still receives guidance to stop and reopen the session.
|
|
14
|
+
|
|
15
|
+
- Release binaries now embed MuPDF WebAssembly only after a pinned upstream source rebuild matches the installed npm artifact byte-for-byte. The matching source archive, build recipe, notices, and provenance are published alongside the binaries instead of relying on an unavailable local release-material bundle.
|
|
16
|
+
|
|
17
|
+
## [0.17.3] - 2026-09-22
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Custom-provider setup now starts OpenAI-compatible model discovery as soon as credentials are supplied, preserves manual fallback, and prevents late previews from changing another wizard step's selection. Leaving confirmation to revise inputs cancels an in-flight submission before opening the editor. Cancellation is checked through the configuration commit boundary, and failed credential restoration is reported rather than silently discarded. No-model recovery guidance exposes both manual model IDs and discovery (#5387).
|
|
22
|
+
|
|
23
|
+
- The in-process SDK now exposes `session.submitUserMessage()` for tracked queued steers and follow-ups. Each submission has a unique identity plus admission, execution, terminal, cancellation, removal, same-run, successor-run, and sequential FIFO lifecycle receipts without relying on private SDK-host correlation hooks.
|
|
24
|
+
|
|
25
|
+
- `gjc sdk` and `gjc daemon` are now AI-friendly to discover and to recover. A static public command registry is the single source of truth for every public path, flag, risk and recovery note; a bounded help renderer serves concise text or an explicit `--json` machine mode under an 8192-byte cap with deterministic section and page traversal; and an opt-in family dispatch hook (`packages/utils/src/cli.ts`) lets sdk/daemon intercept their own argv before generic help and command loading. Every failure now leaves through one versioned `gjc.command-error` envelope carrying a stable code/category, retryability, outcome certainty, allowlisted references (`sessionId`, `operationRef`, `idempotencyKey`, `claimId`, `commandId`, `turnId`) and concrete next-step commands only when they are fully known; unknown or raw errors collapse to a generic `operation_failed`, and no raw exception text is echoed. A failure too large for the envelope is published to a bounded local evidence store (64 slots, 1 MiB per record, 16 MiB total, 24 h TTL, atomic no-overwrite publish with fsync and read-back verification, owner-only POSIX access, paginated digest-verified retrieval) so the complete record can be reconstructed with `gjc sdk --error-ref <id> --error-sha256 <digest>` instead of retried blindly; an unavailable store reports `unavailable` rather than fabricating a continuation. Mixed `gjc daemon` failures retain the operation results of the targets that already completed (`error.partialResults`), because the envelope warns against replaying applied mutations and must therefore carry the resulting state a caller has to reconcile against. No recovery probe, retry or restart is ever automatic, and successful command output, streaming/serve frames and private worker argv are unchanged.
|
|
26
|
+
|
|
27
|
+
- **CLI caller contract:** successful operation output remains unchanged, while public help is bounded/static and ordinary failures now use stderr text by default (exit `1` for operation failures and exit `2` for usage failures). Callers that need machine output must pass `--json` and parse the `gjc.command-error` v1 envelope on stdout; `gjc sdk session raw global --op session.lookup --json` is the documented exception, returning its structured reconciliation DTO on stdout with exit `1` for `not_found`/`conflict`. After `gjc sdk serve --stdio` acquires relay ownership, stdout remains frame-only and post-start transport failures are fixed diagnostics on stderr with exit `1`; mixed daemon status failures never emit partial raw rows and instead carry bounded `error.partialStatuses` in the failure envelope. Scripted callers consuming nonzero output must migrate to these explicit channels and shapes rather than parsing legacy failure text.
|
|
28
|
+
|
|
29
|
+
- Interactive `/fork` opens the user-prompt selector and creates an independently persisted continuation with history before the selected prompt, restoring that prompt as an unsubmitted editor draft. The shared slash/keybinding picker requires persistence, closes active side chats on admission, and synchronizes session UI even when restoration fails after the child is committed. Original transcripts and CLI `--fork` behavior remain unchanged (#5515).
|
|
30
|
+
|
|
31
|
+
- Bash accepts an optional model-declared activity declaration (`activity: { kind: "browser", provider: "aside", mode: "repl" | "exec" }`) and mirrors the accepted value into `BashToolDetails.activity` on foreground results, background/folded starts, and background job progress/terminal details. The `browser.backend: aside` routing prompt now requires the declaration on every Bash invocation that runs Aside, so embedding consumers can project Aside browser activity from the existing tool-call lifecycle instead of parsing command text. The declaration is schema-validated only: malformed values are dropped (never coerced, never fatal), calls without one are ordinary unchanged Bash, and GJC still neither spawns nor supervises Aside nor inspects the command.
|
|
32
|
+
|
|
33
|
+
- `gjc skills discover --limit`, `--query`, and `--offset` forward to the discovery library, which clamps `--limit` to 1-50 and treats `--offset` as a zero-based index into the matching set. Paging is stateless: the text output prints a runnable next-page command (echoing the filters you passed) and prints nothing on the final page. `--json` additionally emits `matching` (skills left after the query filter), `offset`, `nextOffset` (omitted on the final page), and `scanned`, the deduped policy-allowed skill count the query filter ran against. The page bounds what is returned, not what is scanned: discovery still reads the whole catalog to build the matching set.
|
|
34
|
+
|
|
35
|
+
- Add TUI-only `/mcp status`, `suspend`, `resume`, and `reconnect` controls for root interactive sessions started with an explicit `--mcp-config`, with transactional connection replacement and session-local suppression.
|
|
36
|
+
|
|
37
|
+
- `/rename` with no argument now regenerates the session title from the conversation instead of printing a usage error. The automatic title is generated exactly once, from the first user message, so a throwaway opening prompt (`tmp`, a typo, a pasted stack trace) permanently named the session and `/resume` showed that name forever. Regeneration builds a bounded digest — user messages only, the first plus the five most recent, each capped at 400 characters or at an equal share of the 2,000-character input budget when that is smaller (331 characters for a six-message digest) — and persists the result as a user-set title. With nothing to summarize, or when the model returns no usable title, it reports that and leaves the existing name untouched.
|
|
38
|
+
|
|
39
|
+
- Star or unstar the selected session directly from the `gjc --resume` and in-session resume pickers with `Ctrl+S`, with a footer hint and immediate starred-first ordering after saving.
|
|
40
|
+
|
|
41
|
+
- `gjc sdk session close <sessionId>` ends one live SDK session as a first-class verb instead of requiring the raw hatch (`raw global --op session.close --json-input …`). It never attaches to the session, because a Router attachment would renew the host's abandonment window it is meant to end. `--idempotency-key` is optional: the default request key includes the session id and current endpoint generation/incarnation, so retries for one live host replay while a resumed host receives a fresh close identity.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- ACP now makes one bounded, read-only `turn.result` lookup after an uncertain prompt or skill send, using an ACP-owned reference and exact terminal correlation to recover usable retained terminal evidence without replay. Recovery revalidates the current Router attachment before reading, preserves retained truncation metadata, orders recovered text behind queued stream frames, and maps an acknowledged client cancellation to `cancelled`; unrelated provider-registration uncertainty no longer interrupts an already acknowledged prompt. Missing, mismatched, nonterminal, or unavailable evidence remains `terminal_uncertain`; late acknowledgements cannot take ownership of a successor prompt. This recovers retained terminal evidence only: it does **not** settle aborted-tool resources or resolve all of #5401.
|
|
46
|
+
|
|
47
|
+
- Non-persistent direct CLI sessions no longer acquire the shared SDK SessionIndex lock, while persistent sessions continue to publish their liveness registration and surface lock contention.
|
|
48
|
+
|
|
49
|
+
- Standalone builds now package MuPDF and its WASM asset for PDF extraction instead of requiring a globally installed module (#5433); npm/Bun package tarballs include the pinned patched converter and declare its matching runtime dependencies. Short and attachment-named PDFs are accepted as readable text, authoritative non-PDF MIME types retain their handlers, and failed or empty extraction reports a failed inspection rather than raw bytes. Tool diagnostics and default debug logs keep local dependency paths private, and release embedding fails closed until corresponding-source materials are supplied. Explicit raw reads remain available.
|
|
50
|
+
|
|
51
|
+
- Tracked queued SDK submissions now cancel steers rearmed as follow-ups, retain terminal ownership across per-turn attempt-scope rotation, and reject malformed `submitUserMessage` options before dispatch (#5460).
|
|
52
|
+
- Tracked queued submissions settle as removed when successor startup fails before run acceptance, and overloaded AgentSession seams are coalesced in the generated SDK inventory.
|
|
53
|
+
- Accepted tracked submissions now settle as removed when session disposal or identity replacement disconnects the Agent event bridge, while invalid queue policies and legacy `sendUserMessage` tracking flags fail before dispatch.
|
|
54
|
+
- Forked sessions now drop predecessor queued SDK work and its ownership before publishing the successor identity, including submissions already consumed by the predecessor run.
|
|
55
|
+
- Manual compaction now terminalizes already-consumed tracked submissions before disconnecting Agent events, reconciles queue displays without duplicate identities, preserves sequential steering, releases deferred follow-ups, wakes every preserved queue, and restores queued work even when abort fails.
|
|
56
|
+
- Session-switch cleanup now scopes terminalization to predecessor-owned tracked submissions, so submissions admitted by the committed successor hook remain executable and retain their lifecycle receipts.
|
|
57
|
+
- Tracked submissions now reject preflight that crosses a session-identity transition, while committed successor hooks use a scoped admission capability across new, fork, handoff, switch, and branch transitions.
|
|
58
|
+
- `cancelAndSubmit()` resolves deferred selections by executable message identity, preserves sequential steer policy when reclassifying queued work, releases deferred SDK work after every relevant queue removal, preserves FIFO and per-message delivery policy when ordinary follow-ups follow deferred SDK work, and terminalizes accepted submissions when a post-admission callback fails.
|
|
59
|
+
- Post-commit `session_compact` and `session_tree` extension hooks now share the scoped successor admission boundary, so tracked hook submissions are accepted after their transition commit instead of being rejected as busy.
|
|
60
|
+
- Successor admission is limited to tracked queued submissions, ordinary prompts remain fenced during transitions, follow-up reservations wake and reject on transition/disposal, and throwing queue lifecycle callbacks cannot strand later cleanup or deferred work.
|
|
61
|
+
- History rewrites now disconnect and settle predecessor runs before fork, branch, or tree navigation commits, while automatic compaction holds the same transition lease and rearms deferred continuations only after the lease is released.
|
|
62
|
+
- Public, prompt, and custom follow-ups now honor the same admission reservation fence as tracked submissions, so preflight windows cannot be overtaken by ordinary queued work.
|
|
63
|
+
- Rearmed steering and TTSR follow-ups now share that cross-store fence and abort generation, preventing older deferred work from being overtaken or stale injections from running after cancellation.
|
|
64
|
+
|
|
65
|
+
- Resuming a saved session whose complete model chain is no longer registered now uses an authenticated durable profile default as a runtime-only fallback. Saved messages and configured-chain intent remain unchanged; profiles that fail existing catalog, authentication, proxy, alternative-provider, or strict-provider policy still leave resume rolled back (#5512).
|
|
66
|
+
|
|
67
|
+
- Coordinator delegate reuse now resolves endpoint authority from the persisted managed-worktree workspace, preserving `not_indexed` status and retrying transient workspace canonicalization failures instead of sealing them as terminal errors (#5531).
|
|
68
|
+
- Coordinator delegate reuse reauthorizes the persisted cwd/workspace pair against the current allowed and managed-worktree roots before binding, so a narrowed root or redirected projection refuses with `workspace_mismatch` instead of dispatching outside scope.
|
|
69
|
+
- A same-key coordinator delegate retry after a pre-admission failure on a reused session now recovers into a fresh prompt claim; only retries whose prior attempt already started a prompt claim seal as `terminal_uncertain`.
|
|
70
|
+
|
|
71
|
+
- Runtime skill discovery no longer truncates silently. When more skills match than fit on one page, the result now carries a diagnostic naming the shown range, the total matching count, and the exact `--offset` to continue from, so a registered skill beyond the page is reachable instead of invisible. The notice is exempt from the bounded diagnostic budget that stale `skills.customDirectories` entries fill, which is exactly the case that hid it (#5536).
|
|
72
|
+
- `gjc skills discover` now defaults to the widest page the library serves (50) instead of the agent-sized 20, so a human paging the catalog does not lose entries. The `skill_discovery` tool default is unchanged.
|
|
73
|
+
|
|
74
|
+
- Session host abandonment now distinguishes an attached-but-idle chat daemon from active work. Notification adapters identify themselves as observers, while in-flight prompts still keep their host alive, and session activity rows now persist the host's observed active/idle state instead of rewriting every live heartbeat to `active`.
|
|
75
|
+
|
|
76
|
+
- Managed session scope preparation now reaps replacement staging that was stranded as a second hard link to its own published transcript. Managed replacement publishes `.<transcript>.<uuid>.replacement` by exchanging it with the destination, so an interruption between the exchange and the staging unlink leaves the live successor inode reachable under two names. Every managed capture opens no-follow and rejects `nlink > 1` (`captureManagedFileNoFollowLimit`, `inspectManagedFileNoFollow`), so the surplus name silently removed a fully intact session from managed inventory: `--resume <id>` reported `Session "<id>" not found.` and `--continue` reported `Could not inspect managed session: read-failed`, while resume by absolute `.jsonl` path still worked and the transcript bytes were never damaged. Observed on macOS with an 87 MB transcript whose only fault was the extra name. The remnant reaper now also removes a staging name proven to resolve to the same dev/ino as its own published destination — the surplus NAME only, never the inode — and the same rule applies to the async twin used for descendant scopes. Staging that does not alias its destination (an unpublished attempt or a retired predecessor) is still retained as receipt-recovery evidence (#5552).
|
|
77
|
+
|
|
78
|
+
- The SDK prompt deadline now arms at the declared `sdk.promptDeadlineMs` default everywhere. Raising the schema default to 60 minutes left the SDK bus and session host each holding their own hardcoded 30-minute fallback, so a settings lookup that missed still retired a legitimate long turn at the old deadline (#5583).
|
|
79
|
+
- A prompt retired by its deadline no longer tears the session down with the agent's work uncommitted. Uncommitted changes in the session's own worktree are autosaved as a `wip(<branch>): autosave on prompt deadline` commit before teardown, so the next run resumes from a commit instead of re-reasoning. The flush is best effort and never changes the deadline outcome: it is skipped on a clean tree, outside a git worktree, and when renewed progress supersedes the expiry, and any git failure is logged and swallowed. Set `sdk.flushWorktreeOnDeadline` to `false` to opt out (#5583).
|
|
80
|
+
- The deadline autosave is bounded and can never hold session teardown. Its git operations run under an abort signal, and the autosave as a whole is raced against a hard 10-second timeout, so a blocking git lock, a credential prompt, or a hanging commit hook is abandoned rather than waited on. Lifecycle ownership and the deadline lease are always released and the prompt still fails with `prompt_deadline_exceeded` (#5583).
|
|
81
|
+
- Sessions running on the notification-bus route now autosave on a deadline too. That route owns an independent deadline timer and terminalization path, so it previously terminalized `prompt_deadline_exceeded` and tore the session down with the agent's edits still uncommitted. It uses the same bound, the same `sdk.flushWorktreeOnDeadline` opt-out, and only ever commits on the deadline path — a cancelled or failed turn never autosaves (#5583).
|
|
82
|
+
- Progress that arrives while the deadline autosave is running no longer tears down a live prompt. The expiry pass re-checks supersession after the autosave, so a prompt whose lease was renewed during that window keeps its ownership and its rescheduled deadline instead of being retired by the stale expiry (#5583).
|
|
83
|
+
- A deadline autosave never writes your index and never runs your commit hooks. It stages into a throwaway index inside the worktree's own git directory, builds the commit with `git write-tree`/`git commit-tree`, and adopts it only after a compare-and-swap ref update against the HEAD it started from. So a failing or abandoned autosave leaves your real index byte-identical — intent-to-add, skip-worktree, sparse-index and index extensions included, none of which the previous snapshot-and-restore could carry — and an autosave that wakes up after the session is gone finds HEAD moved and drops its commit instead of clobbering whatever landed meanwhile. `pre-commit`/`commit-msg` no longer execute during teardown, and a repository with an unmerged index is left alone entirely (#5583).
|
|
84
|
+
- The deadline autosave now only applies its default to a worktree the session owns. `sdk.flushWorktreeOnDeadline` still defaults to `true`, but the implicit default is honoured only in a linked git worktree — what an agent or task session runs in, and the situation the original report describes. In your primary checkout the autosave is skipped unless you write `sdk.flushWorktreeOnDeadline: true` yourself. It deliberately still stages the whole dirty worktree, untracked files included, because saving exactly the work the agent produced is the point; the ownership boundary is what makes that safe rather than narrowing what gets staged (#5583).
|
|
85
|
+
- The deadline autosave now runs before the prompt's terminal outcome is persisted, not after. It sits between the durable pending claim and the durable terminal on both the SDK host and the notification-bus routes, so a process death anywhere in that window leaves the record pending and restart recovery retries the prompt — instead of a record that reports the prompt finished while the work it claims to have saved is still only in the worktree. The trade-off is that the durable terminal is delayed by at most the autosave's existing 10-second bound (#5583).
|
|
86
|
+
|
|
87
|
+
- An SDK prompt whose `sdk.promptDeadlineMs` lookup misses — no settings object, an unwritten key, or a non-finite stored value — is now bounded by the declared one-hour default instead of a hardcoded 30 minutes, so a long prompt is no longer terminalized at half the timeout the published schema promises.
|
|
88
|
+
- The schema entries and the SDK bus and host lease fallbacks now read the same `sdk.promptDeadlineMs` / `sdk.promptMaxRuntimeMs` default constants, so the armed deadline cannot drift from the documented default again (#5583).
|
|
89
|
+
|
|
90
|
+
- `spawn_failed` responses now report a bounded, sanitized cause (including child exit status when available), and Bun `ENOENT` for a missing absolute executable is handled as a normal broker failure instead of crashing the broker.
|
|
91
|
+
|
|
92
|
+
- Ultragoal succession now permits an explicitly named sibling Git worktree as a target while still rejecting physical aliases of the source worktree and unavailable bound roots; repository-family matching and exact named-target pinning remain unchanged.
|
|
93
|
+
|
|
94
|
+
- Answering a workflow gate no longer reports success for a turn whose continuation was never resolved. `WorkflowGateBroker.resolve()` commits `advanced:true` before it resolves the continuation waiter, so a fence, quarantine, or session transition landing between those two steps left a durably advanced record with an unresolved waiter. `lookupCompletedResolution` could not tell that apart from a genuine completion, so `workflow.gate_answer` returned `ok:true` / `status:"accepted"` with a real `resolved_at` while the originating prompt stayed `in_flight` with `receiptState:"absent"` — and no recovery path would replay it, because `recover()` skips every record already marked advanced. A lost continuation is now recorded and the lookup downgrades to `accepted_incomplete`, which routes through the existing recover-then-recheck branch and surfaces the documented `terminal_uncertain` instead of a false success (#5599).
|
|
95
|
+
- The same false success no longer returns after a process restart. The lost-continuation marker is in-memory and the durable record cannot carry it (an `accepted` record may not hold a `lifecycle`; a `quarantined` one must be `advanced:false`), so a gate owned by a previous runtime is now treated as unprovable rather than completed — a continuation waiter is process-local and cannot survive a restart (#5599).
|
|
96
|
+
- Q12 `workflow.gates.list` now exposes a redacted accepted-answer diagnostic with the originating `runtime_turn_id`, `answer_recorded`, resolution time, and one post-accept disposition; a lost continuation also aborts the owning agent turn so it cannot remain `in_flight` indefinitely (#5599).
|
|
97
|
+
|
|
98
|
+
- Keep settled lifecycle outcomes intact when post-persistence read-back is unavailable, preventing successful session creates from being wedged by a spurious `terminal_uncertain` record.
|
|
99
|
+
|
|
100
|
+
- `transition_claim_timeout` now names why the stale-transition reclaim refused instead of collapsing structurally different situations into one message. A wedged coordinator state claim could previously be a released tombstone from another installation, a tombstone with no installation identity, a same-installation tombstone still inside its release grace window, a live owner, a claim an external process restamped between inspection and capture, or a non-empty claim — all of which needed different operator action and all of which read identically. The error now carries a bounded classifier (for example `(reclaim refused: released_owner_foreign_host)`); it is a fixed enum member and never a path, token, host id, pid, or errno (#5606).
|
|
101
|
+
- Same-installation released transition tombstones now hand off after their grace window instead of timing out, so a waiter can reclaim the aged empty claim. Windows file-lock publication also retries a bounded sequence of pre-mutation `sharing_violation` results before surfacing the persistence failure (#5606).
|
|
102
|
+
|
|
103
|
+
- The managed atomic-rewrite overflow error no longer advises `gjc export <session-file>`, which is not a command. `SessionNearLimitRewriteError` was added with its own hardcoded copy of the recovery advice and reintroduced the exact string #5621 had removed; it now reuses `SESSION_LIMIT_RECOVERY_ACTIONS` like the append path, so both near-limit errors stay in sync. The guidance regression test covers every near-limit error class rather than only the append one (#5621).
|
|
104
|
+
|
|
105
|
+
- Session transcript limit errors no longer advise `gjc export <session-file>`, which is not a subcommand: running it literally started a fresh agent that read `export` as a prompt while the unwritable session was left untouched, and the root `--export` flag only renders HTML. The near-limit append error and its tool-result copy now share one constant naming `/compact` and `/clear` — both dispatchable over ACP as well as the TUI, and both keeping the session manager alive so a retained near-limit entry still persists on the next successful write. The oversized-resume message no longer names an in-session command at all, since it is emitted before any session is open. A regression test resolves every referenced command against the CLI, builtin, and ACP registries (#5621).
|
|
106
|
+
|
|
107
|
+
- An expired SDK prompt deadline now aborts the run at a tool-call boundary instead of through a tool that is still executing (issue #5637). Terminal fencing aborts the run's cancellation domain first and only proves settlement afterwards, so a tool that was mid-write when the deadline expired observed the aborted signal *during* its write — which is how a deadline-killed turn left a torn `apply_patch` in the worktree, logging `Failed: apply_patch` immediately before `Prompt deadline exceeded.`. Expiry now waits for the in-flight dispatched call's own `tool_execution_end` under a short, finite grace (5s) before fencing. The wait is attributed exactly like deadline renewal — correlated to the accepted prompt, dispatched calls only, never pairing-only synthetic tool pairs — so it can neither be held open by an unrelated turn nor by a call that never ran, and a prompt with nothing executing at expiry takes the unchanged path with no timer and no added delay.
|
|
108
|
+
- A prompt whose tool does not reach its boundary within the grace is still force-terminated on exactly the same schedule as before, and the force-termination is now recorded rather than being indistinguishable from a clean expiry: the terminal diagnostic carries a distinct reason naming the grace and how many calls were still executing, and a structured warning carries the correlation, the grace and the pending tool-call ids (ids only — never tool arguments, output or paths). The failure code, provenance, category and message are unchanged (`prompt_deadline_exceeded` / `deadline`), so downstream retry classification is untouched.
|
|
109
|
+
- Whether a tool is executing is now answered by the run resource ledger rather than by `tool_execution_start` arriving through the asynchronous extension fanout. The agent loop takes that ledger lease synchronously, before the tool's `execute` is invoked, and releases it at the call's real end; the start event, by contrast, is queued on the agent event stream and handed to listeners without being awaited, behind any extension registered ahead of the SDK bus. An extension that awaited in its `tool_execution_start` handler therefore left the deadline believing nothing was running and force-aborted mid-`apply_patch` anyway — the exact kill this fix exists to prevent. Whenever that ledger can be read it is now the sole authority, including when it reads back empty. The fanout was wrong in both directions, not one: it could report idle while a tool was mid-write, and — because the same asynchrony that delays a start also delays or drops an end — it could report a call still running long after it had returned, burning the whole grace and recording a forced mid-tool kill for a tool that was already done. The fanout is still tracked for observability and still wakes the boundary wait early, but it is the pending authority only when the ledger cannot be consulted: an older host without the seam, no run bound yet, or a read that failed, each of which falls back to the previous event-derived behaviour.
|
|
110
|
+
- The SDK-only host now threads the same run-resource-ledger seam the notification/SDK bus host does, so the two mutually exclusive host routes expose one seam contract instead of one silently missing a member. This closes a latent asymmetry rather than a live mid-tool kill: the SDK-only deadline path publishes its `agent_failed`/`agent_end` terminal frames and cleans up lifecycle references without aborting the run at all, so there is no mid-execution cancellation to prevent on that route today and no tool-boundary wait is required there. The value is forward-looking — anyone who later adds a boundary wait or a deadline abort to the SDK-only path reads the authoritative ledger instead of silently getting the event-derived fallback. A regression case pins the no-abort property so that change cannot be made silently.
|
|
111
|
+
- An expired deadline now opens at most one boundary wait per submission. At an already-due maximum runtime the deadline cannot be renewed past, so every streamed `tool_execution_update` re-armed a zero-delay timer that immediately opened another concurrent grace wait; a single expiry could accumulate ~100 overlapping waits and timers. Progress is still recorded and the lease renewal is unchanged.
|
|
112
|
+
|
|
113
|
+
- Session host liveness now tracks admitted, queued, and continuing session work with a reference-counted lease, preventing idle reaping while work remains pending (#5652).
|
|
114
|
+
|
|
115
|
+
- A post-start prompt failure classified `provider_transport` now says so in operator-facing wording instead of reading as a failure of the user's task. The reported `server_is_overloaded` case surfaced only as `Internal error: Provider failure after execution started.`, which names no cause an operator can act on; the failure payload now carries an `operatorMessage` stating that the model provider ended the turn. The wording is gated on the bounded classifiers `phase === "post_start"` and `category === "provider_transport"`, so a submission-phase provider failure — where nothing executed — is never described as a turn the provider ended. Because `post_start` proves execution began but not that it was without effect, the message explicitly qualifies that work the turn had already performed may have taken effect, rather than asserting the operator's task was untouched. It is assembled solely from those safe classifier tokens and a `providerCode` that passes `isSafePromptFailureCode`, so no provider text reaches the wire. The JSON-RPC code, the `code`/`details` pair, and every `PROMPT_FAILURE_MESSAGE_*` constant are unchanged, and the message travels alongside them rather than replacing them. Failures in any other phase or category are unchanged: their `phase` and `category` already describe them, so no prose is added. Retry behaviour is unchanged.
|
|
116
|
+
|
|
117
|
+
- Coordinator namespace reads no longer fail with `Coordinator service is unavailable.` when a single session's WAL record is unreadable. Retention no longer compacts away the prompt request that proves an active turn's runtime receipt, legacy `report-<uuid>` ids are migrated onto the canonical digest form instead of being rejected forever, and one `state_corrupt` session is now skipped with a `Coordinator projection recovery skipped session` warning rather than aborting the whole sweep.
|
|
118
|
+
|
|
119
|
+
- Keep coordinator WAL observations lock-free and read-only. Restrict durable legacy report-ID migration to projection recovery, with cancellable, non-waiting lock acquisition and per-session contention isolation.
|
|
120
|
+
|
|
121
|
+
- `gjc sdk session tail` now resumes without dropping observations: callers receive a signed continuation claim after replay/live follow, must provide the last processed transcript id on `--cursor` resumes, and transcript checkpoint failures fall back to the exchanged snapshot instead of returning partial success. Stopped-session tails apply the same boundary and fail with `retention_gap` when it is older than the bounded replay window.
|
|
122
|
+
- Live tail cursors advance after the delivered event position is finalized, so the next CLI invocation does not replay events already returned; frame collection freezes before the final watermark is minted, and a failed final mint fails closed for resumable observations while a session close still returns its complete terminal tail. Tail revision stamping retains the newest explicit revision across checkpoint races, and a bounded live wait returns all collected items with `terminal: false` rather than discarding them.
|
|
123
|
+
|
|
124
|
+
- `gjc sdk serve --stdio` now waits for the upstream hello before forwarding downstream frames and preserves the downstream client's exact v3 capability selection, so capability-gated `tool_activity` frames and live turn content are relayed instead of stopping at the final lifecycle result. A client that explicitly opts into both `turn_stream` and the observer role receives mid-turn tool and assistant frames even when another SDK connection submitted the turn, matching direct socket delivery.
|
|
125
|
+
|
|
126
|
+
- Explain the bounded MCP startup wait and per-server `--timeout` remedy in `gjc mcp list`, and log the server name and actionable reason when startup disconnects or intentionally skips an autoload registration.
|
|
127
|
+
|
|
128
|
+
- `gjc update` no longer fails outright when `api.github.com` has exhausted its 60 requests/hour unauthenticated budget: a rate-limited stable lookup now resolves the latest tag through the `github.com/<repo>/releases/latest` redirect, which is the same origin the release binaries already download from and is not API-rate-limited. The redirect is accepted only from that exact origin and release-tag route, the existing stable-tag and checksum verification are unchanged, and the rate-limit failure (including the nightly channel, which has no web listing to fall back to) now names `GITHUB_TOKEN`/`GH_TOKEN` as the workaround. `scripts/install.sh` gained the same fallback (#5703).
|
|
129
|
+
|
|
130
|
+
- SDK broker startup now reaps aged, empty lock tombstones whose owner record is gone, while retaining non-empty or otherwise ambiguous tombstones and aggregating retention warnings to keep recovery logs actionable (#5705).
|
|
131
|
+
|
|
132
|
+
- Handled tool refusals, policy denials, command failures, and other designed outcomes no longer appear in the crash recorder. Unexpected tool failures retain their original error class and are fingerprinted by their failing frame so repeated failures deduplicate.
|
|
133
|
+
|
|
134
|
+
- Reduced expected startup noise by suppressing duplicate MCP timeout warnings, normalizing model-host preconnect URLs (with a Bun 1.4 fallback), sharing usage polls through the local SQLite cache, and namespacing extension commands that collide with built-ins.
|
|
135
|
+
|
|
136
|
+
- The `/model` picker now treats a successful LiteLLM proxy model discovery response as authoritative, hiding bundled reference models that the proxy did not enroll while retaining the bundled catalog when discovery is unavailable (#5720).
|
|
137
|
+
|
|
138
|
+
- File-lock reclaim and release now tolerate filesystems that do not provide a creation time while retaining stable file identity and content checks for safe cleanup (#5549).
|
|
139
|
+
|
|
140
|
+
- Reconcile macOS SDK child-spawn registration failures durably, retaining launch proof until cleanup state is persisted so retries can close or report an uncertain substrate instead of leaking it.
|
|
141
|
+
|
|
142
|
+
- SDK lifecycle spawn failures now report the readiness stage, child status, and a write-bounded sanitized stderr tail through a detached drainer; launch-scoped and remote MCP header credentials remain redacted and the diagnostic provenance is preserved through uncertain cleanup.
|
|
143
|
+
|
|
144
|
+
- Auto-compaction recovery now reports missing models and credentials as failures instead of silently skipping maintenance. Recovery model-switch notices are emitted only after the candidate's credentials are validated, so credentialless candidates are not reported as used.
|
|
145
|
+
|
|
146
|
+
- Preserve the discovered MCP catalog only while deferred exact-config startup has not published or fenced its first manager snapshot, so startup reports the real tool count without replaying tools suppressed by a concurrent exact control.
|
|
147
|
+
|
|
148
|
+
- Materialized model-profile assignments now resolve against the descriptor-backed profile-activation catalog, so a bare profile assignment can no longer persist a bundled model that fresh live profile evidence excludes.
|
|
149
|
+
|
|
150
|
+
- The advertised `CoordinatorQuestionAnswerV1` answer schema now declares its allowed fields in a sibling `properties` map, so `additionalProperties: false` no longer rejects every selection, free-text (`other`/`custom`), and `clarify` payload in standards-compliant client validators before the coordinator is called. Each `oneOf` branch stays closed, so valid field combinations are unchanged.
|
|
151
|
+
|
|
152
|
+
- Login recovery now defaults to adding a fresh account when the first OAuth account is disabled and an add-account action is available. Interactive authentication bootstrap no longer displays misleading model-fallback warnings; ordinary startup and noninteractive warnings remain unchanged.
|
|
153
|
+
|
|
154
|
+
- Return expired coordinator turn observations without an MCP tool error, preventing normal waits from triggering host failure breakers. Preserve the legacy timeout payload and add `wait_expired:true`; actual request failures remain errors.
|
|
155
|
+
|
|
156
|
+
- The coordinator MCP test fixtures no longer hardcode a workflow-gate `resolved_at`, so the answer-receipt and WAL-quarantine cases cannot age out of the 30-day compaction retention window and turn red on a calendar boundary with no code change.
|
|
157
|
+
|
|
158
|
+
- The coordinator session reaper can now retire an idle ephemeral session whose host is gone while the SDK broker still indexes its unchanged endpoint identity. Such a session previously failed every sweep with `session-reaper: failed to reap <id>: close_failed` and was never force-evicted, because the broker's `endpoint_stale` close answer reached the reaper as `close_failed` and the eviction re-proof accepted any exact identity match as current. The reaper now counts that close as `endpoint_stale`, and force eviction treats a matching broker row as stale only when the broker reports it not live and has recorded no host heartbeat for ten heartbeat intervals. Rows that are still live, or that went quiet only briefly, are never evicted this way. A delete intent that an earlier reap left behind no longer blocks a later `gjc_coordinator_stop_session` once the session has been evicted.
|
|
159
|
+
|
|
160
|
+
- The coordinator session reaper no longer stops reaping for the whole namespace when one ephemeral session's persisted `cwd` or broker workspace falls outside the current `GJC_COORDINATOR_MCP_WORKDIR_ROOTS` (or has no broker workspace). That session is left untouched and skipped with a `Coordinator session reaper skipped an unauthorized session` warning naming it, instead of every sweep being refused with `session-reaper: sweep refused: coordinator_workdir_outside_allowed_roots`. An empty root list still refuses the sweep. The persisted-location authority error keeps its exact message and now carries the escaping `cwd`/`workspace` path in `cause`.
|
|
161
|
+
|
|
162
|
+
- Keep diagnostic-only HTTP/2 failures from authorizing session retry or model fallback.
|
|
163
|
+
|
|
164
|
+
- The utility quarantine contract and the SDK operation inventory now record `/fork` as a restored first-class built-in, matching the shipped `/fork` command from #5515. The quarantine still rejects a headless or standalone utility surface for it, and the inventory maps it to `session.branch` — the operation the prompt selector actually commits through — with every chat, MCP, ACP, and daemon-CLI adapter marked prohibited.
|
|
165
|
+
|
|
166
|
+
- `read` now resolves the `embedded:gjc/...` identifiers that the skill tool and skill discovery report for bundled workflow skills, so reading a bundled `SKILL.md` no longer fails with "Path not found". Line selectors work on those identifiers too.
|
|
167
|
+
- Register the `skill://` protocol handler that was implemented but never wired into the internal URL router, so `skill://<name>` resolves as documented.
|
|
168
|
+
|
|
169
|
+
- GJC sessions no longer crash on a plugin `registry.lock` left behind by a dead writer: lock acquisition now publishes complete host-tagged tokens atomically and evicts locks only when the holder PID on this host is provably dead. Legacy `pid-nonce` tokens have no trustworthy host identity and remain fail-closed, as do live or foreign-host holders; replacement-safe identity checks prevent stale recovery from deleting a successor lock.
|
|
170
|
+
- A registry lock held by a concurrent install no longer fails session startup: `readRegistry` degrades to its already-computed in-memory migration result and leaves persistence to a later uncontended session. Install/mutate paths keep the fail-loud `install_conflict` error.
|
|
171
|
+
|
|
172
|
+
- A server-declared HTTP/2 `REFUSED_STREAM` now falls back to HTTP/1.1 because that protocol error proves the request was never processed. Generic `RST_STREAM`, connection resets, and connection closes preserve their original transport errors instead of replaying a request whose body may already have reached the peer. `HTTP2StreamReset` and `HTTP2RefusedStream` remain classified as transport failures so surfaced messages name the failing host (`transport=<code> url=…`) instead of Bun's context-free hint.
|
|
173
|
+
- Mutable `ArrayBuffer`/view, `FormData`, and `URLSearchParams` bodies fail closed rather than being replayed after an asynchronous refusal, and effective request headers are snapshotted before the HTTP/2 attempt so a caller mutation cannot change the HTTP/1.1 retry.
|
|
174
|
+
|
|
175
|
+
- The binary installer now refuses a symlinked destination before downloading instead of after. `scripts/install.sh` tested `[ -h "$DEST_PATH" ]` only after fetching and checksumming the full release binary, so a checkout linked by `bun run dev:link` waited out the entire download to be told no. The check runs as soon as the destination path is resolved, remains at its original position as the pre-replace TOCTOU guard, and names the development-link case alongside `GJC_INSTALL_DIR`.
|
|
176
|
+
|
|
177
|
+
- A running `job` await now folds on a user steer after the shared foreground grace window, returning promptly while the job keeps its original deadline and remains eligible to wake a later turn with its result. `task` and `subagent` waits remain non-foldable. The fold chord and the SDK `bash.background` control never target a `job` await (its jobs are already in the background), so a `job poll` cannot steal the chord from the foreground bash the user is watching, and a folded await reports the trigger that actually folded it.
|
|
178
|
+
|
|
179
|
+
- The `job` tool result renderer no longer drops the whole component render when a snapshot carries the `paused` status of a folded background job. `Unknown theme color: undefined` came from `statusToColor` returning `undefined` for a status outside its switch, which `formatBadge` then handed to `theme.fg`; paused and unknown snapshot statuses now resolve to a defined icon (`pending`) and badge color (`muted`).
|
|
180
|
+
- Paused snapshots are no longer reported as finished work. The result text partitions terminal jobs (`completed` / `failed` / `cancelled`) under `## Completed` and lists paused or unknown-status snapshots under `## Waiting` with their raw status, and the renderer header counts them as unsettled (`waiting on N of M`) instead of reporting success over a "settled" job list.
|
|
181
|
+
|
|
182
|
+
- Managed session startup failures now report allowlisted identity and filesystem error classifications instead of collapsing them into `binding_invalid`. Unknown or path-bearing messages remain redacted, and the existing top-level error code contract is unchanged.
|
|
183
|
+
|
|
184
|
+
- Release live legacy HTTP and SSE MCP sessions during signal and fatal-exit cleanup, so terminated GJC processes no longer leave server-side `Mcp-Session-Id` state behind.
|
|
185
|
+
|
|
186
|
+
- Interactive and skill turns no longer wait up to 30s on SDK `agent_start` durable persist. The inline host handler no longer times out with `Extension "<inline-N>" error: handler timed out after 30000ms`; SDK consumers still observe start before content.
|
|
187
|
+
|
|
188
|
+
- `gjc sdk serve --session <id>` now recovers a session whose host self-reaped after a detached idle window instead of failing terminally. An explicit session that the broker still indexes but reports as not live is re-materialized once through the existing `session.resume` authority the index already carries, then resolved and served normally. A session that is still not live after that attempt fails with the same `endpoint_stale` error as before, and no other targeting outcome retries (#5633).
|
|
189
|
+
|
|
190
|
+
- SDK: `turn.result` / `skill.invoke_status` retain the bounded final assistant text for completed `skill.invoke` invocations (ralplan, ultragoal); a content-less promise-settlement terminal no longer pre-empts the correlated `agent_end` finalization.
|
|
191
|
+
|
|
192
|
+
- Managed session rewrites that exceed the per-file transcript cap no longer leak a raw `content_too_large` rejection. The atomic rewrite path now reports a typed `SessionNearLimitRewriteError` with the rejected transcript size and cap, while the append recovery path keeps converting the same overflow into `SessionNearLimitAppendError` with fields derived from the appended entry.
|
|
193
|
+
|
|
194
|
+
- Live SDK sessions periodically ensure their broker remains available instead of requiring a new CLI invocation after broker loss. Recovery uses the existing ownership-fenced startup path and stops with the session runtime.
|
|
195
|
+
- Retire a broker registration that completes after session shutdown without removing a replacement host's registration.
|
|
196
|
+
- Keep standalone Telegram command reception alive across periods with no attached sessions, so a temporary routing outage does not remove the remote recovery interface.
|
|
197
|
+
- Stop standalone Telegram ingress when refreshed configuration is disabled, incomplete, changed, or cannot be verified, without logging credentials or bypassing ownership fencing.
|
|
198
|
+
|
|
199
|
+
## [0.17.2] - 2026-09-18
|
|
200
|
+
|
|
201
|
+
### Added
|
|
202
|
+
|
|
203
|
+
- Add a project-local Bash pre-tool hook example that invokes HOL Guard directly and blocks execution unless Guard classifies the command as explicitly benign with an `allow` minimum action.
|
|
204
|
+
|
|
205
|
+
### Fixed
|
|
206
|
+
|
|
207
|
+
- The detached-owner lifecycle suite (`gjc harness start --detach`, B1) no longer skips wholesale on non-Linux hosts. Its `tmux` is a bash fixture and its cgroup inputs are injected through `GJC_HARNESS_TEST_*`, so six of its seven cases carried no real Linux dependency yet only ever ran in CI — leaving a red `dev` undiagnosable for anyone developing on macOS. Only the case that drives the Linux-only `unsafe_service` cgroup branch stays gated.
|
|
208
|
+
- An owner-routed `harness finalize` that never reaches its owner answers `{ completed: false, reason: "owner-not-live" }` with no `finalize` key, so the suite's assertion reported a bare `Received: undefined` and hid the routing reason. It now projects that reason into the assertion and names it.
|
|
209
|
+
|
|
210
|
+
- The coordinator platform-capability test no longer swaps `process.platform` process-wide (which made valid native lock publication receipts look invalid before the artifact handler ran); platform discovery and refusal are now driven entirely through the resolved server platform option.
|
|
211
|
+
|
|
212
|
+
- Endpoint-manager ownership is now released only after disposal and retained async authority actually settle, so a replacement endpoint can no longer be admitted while the outgoing one is still tearing down. Disposal is idempotent, rekey applies the same guard, and SDK startup rollback no longer eagerly unregisters an endpoint that has not finished disposing (#5603).
|
|
213
|
+
|
|
214
|
+
- The detached SDK broker's discovery budget is now published as a composition (`BROKER_DISCOVERY_BUDGET`) instead of three module-private constants and a restated sum, and every deadline and poll on that path runs on an injectable clock. The spawn single-flight regression now spends that budget one leg at a time on a virtual clock, so each leg's cost is measured exactly and a change to any single constant fails an assertion in milliseconds instead of silently re-tuning a wall-clock race (#5604).
|
|
215
|
+
|
|
216
|
+
- Added real external stdio ACP regression coverage and documented stale-broker startup-control provenance failures.
|
|
217
|
+
|
|
218
|
+
- A prompt failure that reaches an ACP client now carries the classification the terminal already computed, instead of collapsing to an untyped `-32603` with `{code: "prompt_failed", details: "Prompt submission failed."}` (issue #5615). The failure's execution `phase`, its bounded origin `category`, and the provider classifier that produced it were derived at settlement and carried on the rejection, then discarded at the single JSON-RPC translation point, so a client watching a mid-session turn die could not tell a transient provider blip from a session that will never answer again without parsing an English message. The JSON-RPC code stays `-32603` (pinned ACP core-v1 conformance expects it for this class) and the redacted message is unchanged; the classification travels in `data`, which additionally exposes a derived `retryability` of `transient`, `terminal`, or `unknown` so a caller does not have to re-implement the category matrix. Only `provider_transport` is transient — the same class the shipped first-turn gate already treats as re-submittable — while a provider rejection, a deadline, and an agent runtime failure are terminal for that turn, and an uncertain attribution stays `unknown` rather than being guessed. `providerCode` is forwarded only when it is a bounded safe token and omitted otherwise, so the redaction contract still holds on this newly exposed field. Retry behaviour is unchanged.
|
|
219
|
+
|
|
220
|
+
- A first-turn startup-readiness failure whose terminal carries only whitespace as final text is now retried once instead of being surfaced as a hard failure, because whitespace carries no assistant content, matching the trimmed presence contract already applied by prompt reconciliation.
|
|
221
|
+
- Such a terminal no longer publishes its whitespace as an assistant message chunk alongside the retry's real answer: final-text resolution and the terminal publication gate now share one trimmed presence predicate, which also suppresses a whitespace-only final-text delta.
|
|
222
|
+
|
|
223
|
+
- Chat daemon replay retention-gap concessions now warn once per session stream and gap range. Reconnect and polling duplicates are demoted to debug, while a new gap range still emits the original warning; the bounded memo prevents long-running daemons from retaining unbounded stream history (issue #5619).
|
|
224
|
+
|
|
225
|
+
- Restore MiniMax-M3 reasoning on/off controls in model selection and reasoning menus for the international and China MiniMax and Coding Plan routes. Send the native `adaptive`/`disabled` switch instead of unsupported reasoning-effort or token-budget parameters, and explicitly disable thinking when the agent selects off (#5626).
|
|
226
|
+
- Show MiniMax M2.x reasoning as always on rather than offering ineffective effort or off controls. Keep model-role labels and the status line consistent with these capabilities.
|
|
227
|
+
- Restrict MiniMax-native thinking behavior to validated first-party HTTPS endpoints and API paths, including the resolved endpoint at request time. Custom proxies retaining a MiniMax provider ID no longer inherit the native thinking contract.
|
|
228
|
+
|
|
229
|
+
- `gjc sdk serve` no longer surfaces a session-selection failure as an uncaught exception with the failure code buried in a message string. Selection failures (`not_found`, `ambiguous_session`, `endpoint_stale`, `no_live_endpoint`, `multiple_live_endpoints`) and the broker-reach failures on the same path now raise a typed error carrying a stable `code`, a broker `SdkClientError` keeps both its `code` and its `details` instead of being downgraded, and the command boundary writes a `{"ok":false,"error":{"code","message"}}` envelope to stderr — never the stdout frame channel — and exits 1 (#5633).
|
|
230
|
+
- `gjc sdk serve` no longer lets broker teardown replace the failure it is reporting. A rejected `broker.close()` in the cleanup path used to overwrite the typed serve error with its own; the primary failure now always wins and the teardown failure rides alongside it as `cleanupError`. When teardown is the only thing that failed, it surfaces as a typed `serve_cleanup_failed` instead of an untyped rejection, and teardown still always runs (#5633).
|
|
231
|
+
- `gjc sdk serve` no longer escapes untyped when the broker discovery record itself is unreadable. A permission, file-kind, or unsupported-state-version failure reading `<agent dir>/sdk/broker.json` used to throw past the command boundary with no stderr envelope and no exit code; it now raises the typed `broker_discovery_unreadable` with the record's path in `details`, never its token. A missing record still reports `broker_unavailable` (#5633).
|
|
232
|
+
- `gjc sdk serve` no longer starts a relay on an endpoint record with an empty credential. A missing, non-string, or empty `token` used to become `""` and be written into the upstream WebSocket URL, where it resurfaced much later as a generic transport failure; it is now refused at the broker boundary with the same typed `unavailable` failure an invalid `url` already produces, before either the stdio or the socket relay starts (#5633).
|
|
233
|
+
- The `gjc sdk serve` stderr envelope no longer drops the broker-teardown diagnostics it records. When a serve failure and a failing `broker.close()` coincide, the envelope now carries `error.cleanupError` alongside `code`, `message` and `details`, so an embedder can see that the session may not have been released cleanly. An envelope with no teardown failure is unchanged — the key is absent, not present and empty (#5633).
|
|
234
|
+
|
|
235
|
+
- Codex session import now recognizes the same credential shapes as its sibling import scrubber. `session-import/codex.ts` listed only `ghp_` of the five GitHub token prefixes and only `AKIA` of the four AWS access-key id prefixes, and knew none of the Google, Slack, npm, GitLab, or Hugging Face shapes that `session-import/redact.ts` already covers — reaching a new session transcript verbatim from an imported Codex file. Stripe restricted keys (`rk_live_`/`rk_test_`) are included: the generic `sk` branch reached the secret-key forms only because they share that prefix. The cheap pre-check that gates the scan is widened with it so the added shapes are actually reached.
|
|
236
|
+
|
|
237
|
+
- Documentation now states the real `sdk.promptDeadlineMs` default. Raising it from 30 to 60 minutes updated the schema but left both READMEs, the Japanese and Korean translations, `docs/sdk.md`, `docs/bot-integration.md`, `docs/hermes-mcp-bridge.md`, `docs/acp-local-development.md`, and the shipped `gjc-sdk-operate` skill telling SDK clients their turn dies after 30 minutes. A new parity test derives the expected figure from the schema default rather than restating it, so the next change to the default fails the build instead of silently misinforming callers (#5637).
|
|
238
|
+
|
|
239
|
+
- The terminal-abort-chain test suite no longer leaks temp agent-state directories. The per-case `finally` already reclaimed the directory on the throwing path, but two paths escaped it: an `afterEach` that exceeds its hook budget is abandoned mid-await so the `finally` never runs, and a writer that outlives teardown can recreate a root the `finally` already removed. Each root is now registered on creation and swept from `afterAll`, which runs in both cases and re-sweeps after a short settle window to catch late writers. A start-of-suite reap also removes roots left by earlier runs, but only ones it can prove are abandoned: each root carries a marker naming the owning pid and host, and a root is removed only when the marker is well-formed, names this host, names a process other than the running one, that process probes as exited (`ESRCH`), and the two-hour age gate has passed. A probe the OS refuses to answer, a missing or malformed marker, and a foreign host all keep the root, so a live shard's directory is never deleted; roots written before the marker existed are consequently never reaped. Measured on macOS, where `os.tmpdir()` is `$TMPDIR` rather than `/tmp`: nine leaked roots per run before, zero after (#5665).
|
|
240
|
+
|
|
241
|
+
- An ACP prompt abandoned by the inactivity watchdog now reports whether the turn's plan was still unfinished instead of collapsing into a generic internal error. The rejection keeps its `prompt_abandoned` code and message, and its JSON-RPC `data` additionally carries `planIncomplete`, `planPendingCount`, `planTotalCount`, and a bounded `planPending` list of the steps the turn never completed, so a wrapper can tell "the agent finished" from "the agent stopped with work left" instead of publishing unverified work as complete. An abandon that never observed a plan omits those fields entirely rather than guessing. A step dropped via `/todo drop` (internal status `abandoned`) counts as unfinished too, even though ACP's three-value plan status projects it as `completed` for the client's plan UI (#5669).
|
|
242
|
+
|
|
243
|
+
- Compiled binaries no longer abort at startup with `SyntaxError: Unexpected identifier 'init_model_registry'`. Resolving MuPDF's embedded WASM no longer makes its module asynchronous, so the bundler keeps emitting a valid module initializer for the `model-registry`/`model-resolver` import cycle.
|
|
244
|
+
|
|
245
|
+
- Managed owner admission now says why it blocked a child. A child that fails closed writes the
|
|
246
|
+
platform and the exact-evidence reader state into its durable handoff and prints one reason line
|
|
247
|
+
to stderr before exiting 75, instead of exiting silently. On platforms without the Linux-only
|
|
248
|
+
recovery-fs authority this reports `exact binding reader unsupported` rather than leaving the
|
|
249
|
+
operator with only the broker's registration-uncertain timeout.
|
|
250
|
+
|
|
251
|
+
- File-lock acquisition exhaustion now reports the real liveness of a holder running on this host instead of calling every host-qualified record "liveness unknown from this host". A lock owned under this installation's current or previous host identity is probed and described as live, dead but not reaped, or indeterminate; only a genuinely foreign owner stays opaque. Reclamation authority is unchanged — the diagnostic and the stale verdict now share one host predicate so they can never disagree about whose PID a record names (#5653).
|
|
252
|
+
- A file-lock holder whose record carries no host identity at all is now described as held "on an unrecorded host" instead of "on host undefined". Such a record is still treated as foreign by a host-aware acquirer — its PID is never probed and its lock is never reclaimed — so only the wording changes (#5653).
|
|
253
|
+
|
|
254
|
+
- ACP prompts no longer hang forever in provider preflight. The inactivity watchdog is now armed from the moment the prompt owns the session, so a `session/prompt` blocked in `ensureProviders()` is rejected as `prompt_abandoned` — naming provider preflight as the phase — instead of reporting `running` with no output, no tool calls and no error.
|
|
255
|
+
- SDK provider activation no longer retries without limit. The registration loop now has an attempt cap and a wall-clock budget, and exhaustion throws `provider_activation_exhausted` naming the contended capability, so lease contention between concurrent session hosts fails attributably instead of spinning.
|
|
256
|
+
|
|
257
|
+
- Model profile activation now diagnoses a required provider this build does not know (neither a built-in provider id nor declared in `models.yml`) as a build/config mismatch with the exact provider names, instead of telling the user to run `/login` for a provider the running binary cannot serve — for example a profile authored on a newer or custom build.
|
|
258
|
+
|
|
259
|
+
- npm-installed source commands no longer resolve MuPDF's embedded WASM through a monorepo-only path. Source installs let MuPDF load its adjacent sidecar, while compiled binaries keep the embedded asset used for PDF conversion.
|
|
260
|
+
|
|
261
|
+
- Allow explicitly configured preset proxy routing through automatically discovered OpenCodex in activation, the preset picker, and SDK availability queries, matching upstream wire model IDs while preserving stored GJC selectors and direct-provider fallback preferences.
|
|
262
|
+
|
|
263
|
+
- A prompt that reaches its SDK deadline now delivers the correlated terminal failure frame to ACP and other SDK clients instead of leaving `session/prompt` waiting behind the watchdog (issue #5583).
|
|
264
|
+
- A prompt whose deadline expires while its real `agent_end` is in flight now publishes exactly one correlated terminal boundary instead of two, so SDK clients no longer see a duplicate `agent_end` for a turn that reconciled to a single durable outcome.
|
|
265
|
+
- A busy session no longer republishes a terminal boundary it already delivered. The single-boundary claim is bounded by capacity, and a publisher parked on its durable writes could have its claim evicted by later turns, so its delayed `agent_end` published a second boundary for an already-terminalized correlation. A correlation with a publisher still able to reach its claim is now never evicted.
|
|
266
|
+
- A prompt deadline that fails to publish its correlated diagnostic still delivers its correlated terminal boundary. The two frames were emitted as one unguarded sequence, so a failure on the first suppressed the second and left the request with no terminal frame at all; each frame is now published independently and a publication failure is logged instead of swallowed.
|
|
267
|
+
- A prompt that reaches its deadline on the notification-bus route — the route a live `--mode acp` session actually uses — no longer supersedes its own expiry. Fencing the run aborts the tool that was still executing, and that tool's completion counted as fresh progress, so the expiry backed off and re-armed forever: no terminal frame ever reached the client and the durable record stayed frozen on its pending claim. Progress caused by the expiry's own abort is now discounted, while progress observed before it still protects a genuinely live prompt.
|
|
268
|
+
|
|
269
|
+
- The skill-discovery genuine-emptiness case pins an empty home directory instead of reading the developer's real `~/.claude/skills`. Convention-import diagnostics from a populated home made the notice appear locally and vanish on a clean CI runner, so the case asserted opposite outcomes per machine. The contract it pins is unchanged: an explicit user-scope request that scans nothing and diagnoses nothing carries no `notice`, while the same empty environment under source `all` always scans the four bundled workflow skills and therefore explains the conjunctive filter.
|
|
270
|
+
|
|
5
271
|
## [0.17.1] - 2026-09-17
|
|
6
272
|
|
|
7
273
|
### Fixed
|
|
@@ -341,14 +341,15 @@ export declare class AsyncJobManager {
|
|
|
341
341
|
* instead of the last-created process-global instance (review thread P1).
|
|
342
342
|
* Returns TRUE when the mapping was installed (or already held by this
|
|
343
343
|
* manager); returns FALSE when the endpoint id is already held by a
|
|
344
|
-
* FOREIGN
|
|
345
|
-
* resumed under that endpoint must then
|
|
346
|
-
* silently replacing the first manager, which
|
|
347
|
-
* session's tools resolve the second manager and let
|
|
348
|
-
* queried, registered, or cancelled across sessions
|
|
344
|
+
* FOREIGN manager whose authority has not fully settled — a second
|
|
345
|
+
* top-level session constructed or resumed under that endpoint must then
|
|
346
|
+
* fail construction instead of silently replacing the first manager, which
|
|
347
|
+
* would make the first session's tools resolve the second manager and let
|
|
348
|
+
* same-id jobs be queried, registered, or cancelled across sessions
|
|
349
|
+
* (review thread P1). */
|
|
349
350
|
static registerForEndpoint(endpointId: string, manager: AsyncJobManager): boolean;
|
|
350
351
|
static forEndpoint(endpointId: string | undefined): AsyncJobManager | undefined;
|
|
351
|
-
static unregisterForEndpoint(endpointId: string): void;
|
|
352
|
+
static unregisterForEndpoint(endpointId: string, manager?: AsyncJobManager): void;
|
|
352
353
|
/** Reverse lookup: the endpoint this manager is registered under, if any
|
|
353
354
|
* (review thread P1 — endpoint-scoped lineage resolution). */
|
|
354
355
|
static endpointIdOf(manager: AsyncJobManager | undefined): string | undefined;
|
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Settings } from "../config/settings";
|
|
8
8
|
import type { BuiltInDaemonController, DaemonKind } from "../daemon/control-types";
|
|
9
|
+
import { PublicCommandFailure } from "./public-command-errors";
|
|
9
10
|
export type DaemonCliAction = "list" | "status" | "stop" | "restart";
|
|
10
11
|
export type DaemonInternalCliAction = "discord-internal" | "slack-internal";
|
|
11
12
|
export type DaemonCommandAction = DaemonCliAction | DaemonInternalCliAction;
|
|
12
|
-
export declare class UnknownDaemonKindError extends
|
|
13
|
+
export declare class UnknownDaemonKindError extends PublicCommandFailure {
|
|
13
14
|
readonly kinds: readonly string[];
|
|
14
15
|
readonly knownKinds: readonly DaemonKind[];
|
|
15
16
|
constructor(kinds: readonly string[], knownKinds: readonly DaemonKind[]);
|
|
@@ -34,6 +35,7 @@ export interface DaemonCommandArgs {
|
|
|
34
35
|
export interface DaemonCommandDeps {
|
|
35
36
|
settings?: Settings;
|
|
36
37
|
controllers?: BuiltInDaemonController[];
|
|
38
|
+
/** Internal update orchestration retains result rendering and failure aggregation. */
|
|
37
39
|
setExitCode?: (code: number) => void;
|
|
38
40
|
}
|
|
39
41
|
export declare function parseDaemonArgs(argv: string[]): DaemonCommandArgs | undefined;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import type { UpdateChannel } from "../config/update-channel";
|
|
6
6
|
export declare const RELEASE_REPO = "Yeachan-Heo/gajae-code";
|
|
7
7
|
export declare const GITHUB_API_ORIGIN = "https://api.github.com";
|
|
8
|
+
export declare const GITHUB_WEB_ORIGIN = "https://github.com";
|
|
8
9
|
export declare const GITHUB_RELEASE_DOWNLOAD_ORIGIN = "https://github.com/Yeachan-Heo/gajae-code/releases/download";
|
|
9
10
|
export declare const BINARY_SHA256_ASSET = "gajae-release-binaries.sha256";
|
|
10
11
|
export declare const BINARY_MANIFEST_ASSET = "gajae-release-binaries-v1.json";
|
|
@@ -21,12 +22,28 @@ export interface GithubReleaseLookupOptions {
|
|
|
21
22
|
fetchImpl?: GithubFetch;
|
|
22
23
|
lookupEnv?: (name: string) => string | undefined;
|
|
23
24
|
apiOrigin?: string;
|
|
25
|
+
webOrigin?: string;
|
|
24
26
|
timeoutMs?: number;
|
|
25
27
|
useAmbientToken?: boolean;
|
|
26
28
|
}
|
|
29
|
+
/** A GitHub REST response that failed, carrying the status the caller must branch on. */
|
|
30
|
+
export declare class GithubApiStatusError extends Error {
|
|
31
|
+
readonly url: string;
|
|
32
|
+
readonly status: number;
|
|
33
|
+
constructor(url: string, status: number);
|
|
34
|
+
/** 403/429 is how api.github.com reports an exhausted unauthenticated budget. */
|
|
35
|
+
get isRateLimited(): boolean;
|
|
36
|
+
}
|
|
27
37
|
export declare function isSafeReleaseTag(tag: string): boolean;
|
|
28
38
|
export declare function versionFromTag(tag: string): string;
|
|
29
39
|
export declare function githubReleaseHeaders(token: string | undefined): Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the stable tag through the `github.com` web route, which 302s from
|
|
42
|
+
* `/releases/latest` to `/releases/tag/<tag>`. That origin serves the binary
|
|
43
|
+
* downloads too and is not bound by the api.github.com rate limit, so it keeps
|
|
44
|
+
* `gjc update` working on a shared IP whose unauthenticated budget is spent.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveStableReleaseTagFromWeb(options?: GithubReleaseLookupOptions): Promise<string>;
|
|
30
47
|
export declare function fetchGithubChannelRelease(options?: GithubReleaseLookupOptions): Promise<GithubReleaseInfo>;
|
|
31
48
|
export declare function parseChecksumForAsset(text: string, assetName: string): string | undefined;
|
|
32
49
|
export declare function parseManifestChecksum(payload: unknown, assetName: string): string | undefined;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type CommandCtor, type CommandEntryContext } from "@gajae-code/utils/cli";
|
|
2
|
+
import { type PublicCommandDescriptor, type PublicCommandFamily, type PublicHelpSection } from "./public-command-registry";
|
|
3
|
+
export type PublicUsageIssueCode = "unknown-path" | "unknown-flag" | "missing-value" | "invalid-value" | "duplicate-flag" | "missing-flag" | "missing-argument" | "unexpected-argument" | "conflict" | "requires" | "exclusive";
|
|
4
|
+
/** Only descriptor-owned names and static messages are safe for output. Never include argv values. */
|
|
5
|
+
export interface PublicUsageIssue {
|
|
6
|
+
code: PublicUsageIssueCode;
|
|
7
|
+
message: string;
|
|
8
|
+
field?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PublicHelpOptions {
|
|
11
|
+
section: PublicHelpSection;
|
|
12
|
+
page: number;
|
|
13
|
+
revision?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PublicRetrievalOptions {
|
|
16
|
+
id: string;
|
|
17
|
+
sha256: string;
|
|
18
|
+
page: number;
|
|
19
|
+
agentDir?: string;
|
|
20
|
+
}
|
|
21
|
+
interface PublicScanBase {
|
|
22
|
+
descriptor: PublicCommandDescriptor;
|
|
23
|
+
mode: "text" | "json";
|
|
24
|
+
args: Record<string, string | string[] | undefined>;
|
|
25
|
+
flags: Record<string, unknown>;
|
|
26
|
+
/** Family-relative argv, retaining child paths and operation tokens in their original order. */
|
|
27
|
+
operationArgv: string[];
|
|
28
|
+
help: PublicHelpOptions;
|
|
29
|
+
retrieval?: PublicRetrievalOptions;
|
|
30
|
+
}
|
|
31
|
+
export type PublicCommandScan = PublicScanBase & ({
|
|
32
|
+
kind: "usage";
|
|
33
|
+
issues: PublicUsageIssue[];
|
|
34
|
+
} | {
|
|
35
|
+
kind: "help" | "retrieval" | "operation";
|
|
36
|
+
issues: [];
|
|
37
|
+
});
|
|
38
|
+
/** Inert, descriptor-driven scanner. argv excludes the already resolved family token. */
|
|
39
|
+
export declare function scanPublicCommand(family: PublicCommandFamily, argv: readonly string[]): PublicCommandScan;
|
|
40
|
+
export interface PublicCommandDispatchContext extends CommandEntryContext {
|
|
41
|
+
command: PublicCommandFamily;
|
|
42
|
+
load: () => Promise<CommandCtor>;
|
|
43
|
+
/** Only operations may initialize settings, transports, themes or runtime globals. */
|
|
44
|
+
setup?: (report: (diagnostic: {
|
|
45
|
+
code: "macos_nofile_limit_low";
|
|
46
|
+
successStderr: string;
|
|
47
|
+
}) => void) => Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare function isSafeSdkInternalAgentDir(value: string): boolean;
|
|
50
|
+
/** Mirrors commands/sdk.ts parseSdkInternalArgv without eagerly loading its runtime. */
|
|
51
|
+
export declare function isSdkInternalArgv(argv: readonly string[]): boolean;
|
|
52
|
+
/** Mirrors the exact private argv emitted by chat-daemon controller spawns. */
|
|
53
|
+
export declare function isDaemonInternalArgv(argv: readonly string[]): boolean;
|
|
54
|
+
/** Single family boundary, shared by early bootstrap routing and registered utility dispatch. */
|
|
55
|
+
export declare function dispatchPublicCommand(argv: readonly string[], context: PublicCommandDispatchContext): Promise<void>;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { DaemonOperationResult, DaemonRecovery, DaemonStatus } from "../daemon/control-types";
|
|
2
|
+
import { type EvidenceClassification, type EvidenceContinuation, type EvidenceReference, type EvidenceUnavailableReason } from "./public-command-evidence";
|
|
3
|
+
export type PublicFailureKind = "usage" | "invalid_json" | "unavailable" | "broker_unavailable" | "endpoint_stale" | "broker_restarting" | "authorization_denied" | "timeout" | "wait_timeout" | "uncertain_after_send" | "daemon_unhealthy" | "daemon_stale" | "daemon_mixed" | "operation_failed" | "internal";
|
|
4
|
+
export type PublicEffectProof = "pre-send" | "pre-effect" | "accepted" | "completed" | "sent" | "unknown";
|
|
5
|
+
export interface PublicDaemonTargetOutcome {
|
|
6
|
+
kind: "telegram" | "discord" | "slack";
|
|
7
|
+
outcome: "not-applied" | "applied" | "unknown";
|
|
8
|
+
}
|
|
9
|
+
export interface PublicCommandFailureInput {
|
|
10
|
+
kind: PublicFailureKind;
|
|
11
|
+
proof?: PublicEffectProof;
|
|
12
|
+
references?: readonly EvidenceReference[];
|
|
13
|
+
daemonKind?: "telegram" | "discord" | "slack";
|
|
14
|
+
restartJustified?: boolean;
|
|
15
|
+
targets?: readonly PublicDaemonTargetOutcome[];
|
|
16
|
+
partialStatuses?: readonly DaemonStatus[];
|
|
17
|
+
/**
|
|
18
|
+
* Operation results already completed before a later target failed. Without them
|
|
19
|
+
* a `daemon_mixed` failure tells the caller not to repeat applied mutations but
|
|
20
|
+
* withholds the resulting state it would have to reconcile against.
|
|
21
|
+
*/
|
|
22
|
+
partialResults?: readonly DaemonOperationResult[];
|
|
23
|
+
diagnostics?: readonly PublicCommandDiagnosticCode[];
|
|
24
|
+
}
|
|
25
|
+
export declare class PublicCommandFailure extends Error {
|
|
26
|
+
readonly input: PublicCommandFailureInput;
|
|
27
|
+
constructor(input: PublicCommandFailureInput);
|
|
28
|
+
}
|
|
29
|
+
export interface PublicRecoveryStep {
|
|
30
|
+
description: string;
|
|
31
|
+
disruption: "none" | "interrupts-work" | "force-kill";
|
|
32
|
+
requiresConfirmation: boolean;
|
|
33
|
+
executable?: "gjc";
|
|
34
|
+
argv?: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface ClassifiedPublicCommandFailure extends EvidenceClassification {
|
|
37
|
+
message: string;
|
|
38
|
+
references: EvidenceReference[];
|
|
39
|
+
nextSteps: PublicRecoveryStep[];
|
|
40
|
+
partialStatuses?: DaemonStatus[];
|
|
41
|
+
partialResults?: PublicDaemonOperationResult[];
|
|
42
|
+
exitCode: 1 | 2;
|
|
43
|
+
}
|
|
44
|
+
/** Bounded projection of a completed daemon operation result for failure envelopes. */
|
|
45
|
+
export interface PublicDaemonOperationResult {
|
|
46
|
+
kind: "telegram" | "discord" | "slack";
|
|
47
|
+
action: DaemonOperationResult["action"];
|
|
48
|
+
ok: boolean;
|
|
49
|
+
before?: DaemonStatus;
|
|
50
|
+
after?: DaemonStatus;
|
|
51
|
+
/**
|
|
52
|
+
* Typed allowlisted recovery category only. The failure envelope never echoes
|
|
53
|
+
* controller-supplied free text, so the message, warnings, and remediation
|
|
54
|
+
* strings of a completed operation stay out of it.
|
|
55
|
+
*/
|
|
56
|
+
recovery?: {
|
|
57
|
+
reason: DaemonRecovery["reason"];
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export declare const EVIDENCE_UNAVAILABLE_WARNING = "Necessary reconciliation evidence could not be retained; no lossless continuation is available. Do not blindly retry the original operation.";
|
|
61
|
+
export type PublicEvidenceStatus = {
|
|
62
|
+
status: "inline";
|
|
63
|
+
} | {
|
|
64
|
+
status: "retained";
|
|
65
|
+
id: string;
|
|
66
|
+
sha256: string;
|
|
67
|
+
bytes: number;
|
|
68
|
+
expiresAt: string;
|
|
69
|
+
} | {
|
|
70
|
+
status: "unavailable";
|
|
71
|
+
reason: EvidenceUnavailableReason;
|
|
72
|
+
requiredBytes: number | null;
|
|
73
|
+
missingKinds: string[];
|
|
74
|
+
warning: typeof EVIDENCE_UNAVAILABLE_WARNING;
|
|
75
|
+
};
|
|
76
|
+
export declare const PUBLIC_COMMAND_DIAGNOSTICS: {
|
|
77
|
+
readonly macos_nofile_limit_low: "The macOS open-file limit is below the recommended minimum; increase it before starting additional concurrent work.";
|
|
78
|
+
readonly router_cleanup_failed: "SDK session Router cleanup failed.";
|
|
79
|
+
readonly broker_cleanup_failed: "SDK broker client cleanup failed.";
|
|
80
|
+
readonly usage_transport_exclusive: "Specify exactly one of --stdio or --socket <path>.";
|
|
81
|
+
readonly usage_duplicate_option: "Each option on this command may occur at most once.";
|
|
82
|
+
readonly usage_unknown_argument: "An unrecognized argument was supplied; re-read the command help for its accepted grammar.";
|
|
83
|
+
readonly usage_missing_value: "An option that requires a value was supplied without one.";
|
|
84
|
+
readonly usage_invalid_option_value: "An option value is invalid; re-read the command help for its accepted values.";
|
|
85
|
+
};
|
|
86
|
+
export type PublicCommandDiagnosticCode = keyof typeof PUBLIC_COMMAND_DIAGNOSTICS;
|
|
87
|
+
export interface PublicCommandDiagnostic {
|
|
88
|
+
code: PublicCommandDiagnosticCode;
|
|
89
|
+
message: string;
|
|
90
|
+
}
|
|
91
|
+
export interface PublicCommandErrorEnvelope {
|
|
92
|
+
schema: "gjc.command-error";
|
|
93
|
+
version: 1;
|
|
94
|
+
ok: false;
|
|
95
|
+
command: string[];
|
|
96
|
+
error: Omit<ClassifiedPublicCommandFailure, "exitCode">;
|
|
97
|
+
diagnostics?: PublicCommandDiagnostic[];
|
|
98
|
+
omittedOptional: {
|
|
99
|
+
path: string;
|
|
100
|
+
reason: string;
|
|
101
|
+
}[];
|
|
102
|
+
complete: boolean;
|
|
103
|
+
evidence: PublicEvidenceStatus;
|
|
104
|
+
continuation: EvidenceContinuation | null;
|
|
105
|
+
}
|
|
106
|
+
export interface RenderPublicCommandFailureOptions {
|
|
107
|
+
command: readonly string[];
|
|
108
|
+
json?: boolean;
|
|
109
|
+
agentDir?: string;
|
|
110
|
+
scopeAgentDir?: string;
|
|
111
|
+
diagnostics?: readonly PublicCommandDiagnosticCode[];
|
|
112
|
+
}
|
|
113
|
+
export interface RenderedPublicCommandFailure {
|
|
114
|
+
stdout: string;
|
|
115
|
+
stderr: string;
|
|
116
|
+
exitCode: 1 | 2;
|
|
117
|
+
envelope: PublicCommandErrorEnvelope;
|
|
118
|
+
}
|
|
119
|
+
export declare function normalizePublicCommandFailure(error: unknown): PublicCommandFailure;
|
|
120
|
+
export declare function classifyPublicCommandFailure(error: unknown, command: readonly string[]): ClassifiedPublicCommandFailure;
|
|
121
|
+
export declare function renderPublicCommandFailure(error: unknown, options: RenderPublicCommandFailureOptions): Promise<RenderedPublicCommandFailure>;
|
|
122
|
+
/** Retrieval failures never recursively publish evidence or replay an operation. */
|
|
123
|
+
export declare function renderPublicEvidenceUnavailable(unavailable: {
|
|
124
|
+
reason: EvidenceUnavailableReason;
|
|
125
|
+
requiredBytes: number | null;
|
|
126
|
+
}, options: RenderPublicCommandFailureOptions): RenderedPublicCommandFailure;
|